/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package src.j2ee.compumake.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import src.j2ee.compumake.dominio.InformacionUsuario;
import src.j2ee.compumake.dominio.Usuario;

/************************************************************************
 **                                                                    **
 ** Nombre: DAOUsuario.java                                            **
 ** Version: v1.0.0                                                    **
 ** Autor: amado.cante                                                 **
 ** Creado: 20/04/2013                                                 **
 ** Modificado:                                                        **
 ** Diagrama:                                                          **
 ** Caso de uso:                                                       **
 **                                                                    **
 ***********************************************************************/
public class DAOUsuario {
    private Connection conexion = null;
    private static final String TABLA_USUARIOS = "Usuarios";
    private static final String CONTRASENIA="contrasenia";
    private static final String PRIVILEGIO="privilegio";
    private static final String INFORMACION="informacion";
    private static final String USUARIO = "nombreUsuario";
    private DAOInformacionUsuario daoInformacionUsuario;
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    
    public DAOUsuario(){
        this.conexion=this.acceso.abrirConexion();
        this.daoInformacionUsuario = new DAOInformacionUsuario();
    }
    
    public String registrarUsuario(Usuario usuario){
        if(this.existeUsuario(usuario)){
            return "Lo sentimos, el nombre de usuario que intenta registrar ya se encuentra registrado.";
        }else{
            Statement sentencia = this.acceso.crearSentenciaBD(conexion);
            try{
                int claveInformacion = daoInformacionUsuario.registrarInformacion(usuario.getInformacion());
                if(claveInformacion>0){
                    String query = "INSERT INTO "+TABLA_USUARIOS+"("+USUARIO+","+INFORMACION+","+CONTRASENIA+","+PRIVILEGIO+") "
                            + "VALUES ('"+usuario.getNombreUsuario()+"','"+claveInformacion+"','"+usuario.getContrasenia()+"','"+usuario.getPrivilegio()+"')";
                    sentencia.executeUpdate(query);
                }else{
                    return "Ocurri&oacute; un problema con la base de datos. No fue posible registrar la informaci&oacute;n del usuario.";
                }
            }catch (SQLException sqlex){
                return "Ocurri&oacute; un problema con la base de datos. No fue posible registrar el usuario.";
            }finally{
                this.acceso.cerrarConexion(conexion);
            }
            return "true";
        }
    }
    
    public Usuario validaContrasenia(String nombreUsuario, String contrasenia){
        Usuario usuarioBD = this.buscarUsuario(nombreUsuario);
        if(usuarioBD == null){
            return null;
        }else{
            if(usuarioBD.getContrasenia().equals(contrasenia)){
                return usuarioBD;
            }else{
                return null;
            }
        }
    }
    
    private boolean existeUsuario(Usuario usuario) {
        if(this.buscarUsuario(usuario.getNombreUsuario())!=null){
            return true;
        }else{
            return false;
        }
    }
    
    public Usuario buscarUsuario(String nombreUsuario){
        try{
            Statement sentencia = this.acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_USUARIOS+",InformacionUsuario WHERE InformacionUsuario.idInformacionUsuario=Usuarios.informacion AND Usuarios.nombreUsuario='"+nombreUsuario+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            if(resultado.first()){
                String nombre = resultado.getString(USUARIO);
                int idInformacion = resultado.getInt(INFORMACION);
                String contrasenia = resultado.getString(CONTRASENIA);
                int privilegio = resultado.getInt(PRIVILEGIO);
                InformacionUsuario informacion = daoInformacionUsuario.buscaInformacion(idInformacion);
                Usuario usuario = new Usuario(nombreUsuario, contrasenia, informacion, privilegio);
                return usuario;
            }
        }catch (SQLException ex) {
            Logger.getLogger(DAOUsuario.class.getName()).log(Level.SEVERE, null, ex);
        }    
        return null;
    }
    
    public boolean editarInformacionUsuario(InformacionUsuario informacion){
        DAOInformacionUsuario daoinfo = new DAOInformacionUsuario();
        return daoinfo.actualizarInformacion(informacion);
    }
    
    public boolean editaContrasenia(Usuario usuario){
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "UPDATE "+TABLA_USUARIOS+" SET "+CONTRASENIA+"='"+usuario.getContrasenia()+"' WHERE "+
                    USUARIO+"='"+usuario.getNombreUsuario()+"';";
            int afectado = sentencia.executeUpdate(query);
            if(afectado>0){
                return true;
            }else{
                return false;
            }
        }catch(SQLException ex){
            return false;
        }
    }
    protected boolean hacerEncargadoSucursal(Usuario usuario){
        try{
            Statement sentencia = this.acceso.crearSentenciaBD(conexion);
            String query = "UPDATE "+TABLA_USUARIOS+" SET "+PRIVILEGIO
                    +"='2' WHERE "+USUARIO+"='"+usuario.getNombreUsuario()+"';";
            int afectado = sentencia.executeUpdate(query);
            if(afectado>0){
                return true;
            }else{
                return false;
            }
        }catch(SQLException ex){
            return false;
        }
    }
    
    public ArrayList<Usuario> listarUsuarios(){
        ArrayList<Usuario> todosLosUsuarios = new ArrayList<>();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT "+USUARIO+" FROM "+TABLA_USUARIOS;
            
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                String nombreUsuario = resultado.getString(1);
                Usuario nuevoUsuario = this.buscarUsuario(nombreUsuario);
                if(nuevoUsuario!=null){
                    todosLosUsuarios.add(nuevoUsuario);
                }
            }
            return todosLosUsuarios;
        }
        catch (SQLException ex) {
            return todosLosUsuarios;
        }
    }
    
}
